package agenda;

import excecoes.NomeInvalido;
import excecoes.FormaDeContatoInvalida;
import java.io.Serializable;

public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;

	private String nome, descricao;
	private FormaDeContato email;
	private Agenda agenda;

	/**
	 * Cria um Usuario.
	 */

	public Usuario() {
		nome = null;
		descricao = null;
                email = null;
		agenda = new Agenda();
	}

	/**
	 * Recupera o nome do usuario.
	 * @return Nome do usuario.
	 */

	public String getNome() {
		return nome;
	}

	/**
	 * Altera o nome do usuario.
	 * @param nome Novo nome do usuario.
	 * @throws NomeInvalido Excecao caso o nome seja invalido.
	 */

	public void setNome(String nome) throws NomeInvalido {
		validaNome(nome);
		this.nome = nome;
	}

	/**
	 * Verifica a validade de um nome.
	 * @param nome O nome a ser validado.
	 * @throws NomeInvalido Lanca excecao caso o nome seja invalido.
	 */

	public static void validaNome(String nome) throws NomeInvalido {
		for (int i=0; i < nome.length(); i++) {
			char c = nome.charAt(i);

			if (!Character.isLetter(c) && c != ' ') {
				throw new NomeInvalido("Um nome nao deve conter numeros ou caracteres especiais.");
			}
		}
	}

	/**
	 * Recupera o Email do usuario.
	 * @return O email do usuario.
	 */

	public String getEmail() {
            if (email == null) {
                return null;
            }
            return email.getEndereco();
	}

	/**
	 * Altera o endereco de e-mail do usuario.
	 * @param email O novo endereco de e-mail do usuario.
	 * @throws EmailInvalido Lanca excecao de EmailInvalido caso o e-mail seja invalido.
	 */

	public void setEmail(String email) throws FormaDeContatoInvalida {

		this.email = new Email(email);
	}

	/**
	 * Recupera a descricao do usuario.
	 * @return A descricao do usuario.
	 */

	public String getDescricao() {
		return descricao;
	}

	/**
	 * Altera a descricao do usuario
	 * @param descricao	A nova descricao do usuario.
	 */

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	/**
	 * Recupera a agenda do usuario.
	 * @return A agenda do usuario.
	 */

	public Agenda getAgenda() {
		return agenda;
	}

	/**
	 * Adiciona um novo contato a a agenda do usuario,
	 * @param c O novo contato.
	 */

	public void addContato(Contato c) {
		agenda.addContato(c);
	}

	/**
	 * Adiciona um novo evento a a agenda do usuario.
	 * @param ev O novo evento.
	 */

	public void addEvento(Evento ev) {
		agenda.addEvento(ev);
	}

	/**
	 * Representa um Usuario como String.
	 * @return Uma String que representa o usuario.
	 */

	@Override
	public String toString() {

		String result = "Nome: " + getNome() + "\n";
		result += "E-mail: " + getEmail() + "\n";
		result += "Descricao: " + getDescricao();

		return result;
	}
}